#include "adLogic.h"
#include "adDao.h"
#include <glib.h>
#include <gio/gio.h>
#include <stdlib.h>
#include "gateway.h"
#define RES_PATH "/home/lxk/src/media"

//处理路径
char* getResPath(AdResource *ar){
    //1.取出外键 广告的id
    int adId =ar->ad_id;
    //2.取出网络的path路径
    char *path =ar->path;// http://47.109.65.208/images/video/44.mp4
    //3.获取对应的文件的真实名字
    gchar *fileName= g_path_get_basename(path);// 44.mp4
    
    //4.准备一个用来格式化模板
    char *farmatStr="%s/%d_%s";
    // /home/heron/ronghua-ads/media/1_44.mp4
    return g_strdup_printf(farmatStr,RES_PATH,adId,fileName);
}

Ad *parseUpDownSplitScr(cJSON *item){
    /*  
                "id":1,
                "template_id":6,
                "customer_id":1,
                "top_media_type_id":1,
                "top_media_url":"http://localhost:80/1.mp4",
                "top_media_sign":"jfjjfjfjj",
                "buttom_media_type_id":2,
                "buttom_media_url":"http://localhost:80/add.png",
                "buttom_media_sign":"jfjjfjfjj",
                "start_time": "2024-06-01 00:00:00",
                "end_time": "2024-06-30 23:59:59",
                "state":0

    */
    cJSON *id = cJSON_GetObjectItemCaseSensitive(item,"id");
    cJSON *template_id = cJSON_GetObjectItemCaseSensitive(item,"template_id");
    cJSON *customer_id = cJSON_GetObjectItemCaseSensitive(item,"customer_id");
    cJSON *top_media_type_id = cJSON_GetObjectItemCaseSensitive(item,"top_media_type_id");
    cJSON *top_media_url = cJSON_GetObjectItemCaseSensitive(item,"top_media_url");
    cJSON *top_media_sign = cJSON_GetObjectItemCaseSensitive(item,"top_media_sign");
    cJSON *buttom_media_type_id = cJSON_GetObjectItemCaseSensitive(item,"buttom_media_type_id");
    cJSON *buttom_media_url = cJSON_GetObjectItemCaseSensitive(item,"buttom_media_url");
    cJSON *buttom_media_sign = cJSON_GetObjectItemCaseSensitive(item,"buttom_media_sign");
    cJSON *start_time = cJSON_GetObjectItemCaseSensitive(item,"start_time");
    cJSON *end_time = cJSON_GetObjectItemCaseSensitive(item,"end_time");
    cJSON *state = cJSON_GetObjectItemCaseSensitive(item,"state");
    //使用一个结构体装数据

    Ad * result = calloc(1,sizeof(Ad));
    result->id=id->valueint;  
    result->templateId  = template_id->valueint;
    result->customerId  = customer_id->valueint;
    result->start_time  = start_time->valuestring;
    result->end_time  = end_time->valuestring;

      //广告资源解析
    AdResource *upAr = calloc(1,sizeof(AdResource));
    upAr->ad_id = id->valueint;
    upAr->index = 0;
    upAr->type_id = top_media_type_id->valueint;
    upAr->path = top_media_url->valuestring;
    upAr->sign = top_media_sign->valuestring;   
    result->resources[0] =upAr;

    AdResource *buttomAr = calloc(1,sizeof(AdResource));
    buttomAr->ad_id = id->valueint;
    buttomAr->index = 1;
    buttomAr->type_id = buttom_media_type_id->valueint;
    buttomAr->path = buttom_media_url->valuestring;
    buttomAr->sign = buttom_media_sign->valuestring;        
    result->resources[1] =buttomAr;

    result->resources[2] =NULL;

    return result;
}

Ad *paresAdItem(cJSON *item){
    //获取出当前的广告是什么分屏模式
    cJSON *tmepId = cJSON_GetObjectItemCaseSensitive(item,"template_id");
    int template_id = tmepId->valueint;
    Ad *result;
    switch (template_id)
    {
    case 1:
        /* code */
        break;
    case 2:
        /* code */
        break;
    case 6://上下分屏模式
        //调用上下分屏数据解析的函数
        result=parseUpDownSplitScr(item);
        
        break;        
    
    default:
        break;
    }
    

    return result;
}


void paresAdList(cJSON *ad_list){
    //1.ad_list是不是一个数组
    if (cJSON_IsArray(ad_list))
    {
        //遍历数组
        int size = cJSON_GetArraySize(ad_list);//2
        Ad *ads[size];//2

        for(int i = 0; i < size; i++)
        {
            //依次取出数据
            cJSON *item= cJSON_GetArrayItem(ad_list,i);
            //解析数据
            Ad *ad= paresAdItem(item);
            ads[i]=ad;


        }
        
        //完成数据的存储，文件的处理
        //2 打印远程播放列表
        // for (int i = 0; i < size; i++){
        //     Ad* ad= ads[i];
        //     if (ad==NULL)
        //     {
        //         continue;
        //     }

        //     printf("id=%d,template_id=%d\n",ad->id,ad->templateId);
        //    for (int j = 0; j < 3; j++)
        //    {
        //        AdResource *ar = ad->resources[j];
        //        if (ar==NULL)
        //        {
        //           continue;
        //        }  
        //        printf("id=%d,path=%s,sign=%s\n",ar->id,ar->path,ar->sign);
        //    }
        //    printf("==========================\n");   
        // }

        //把数据放到数据库里面，并且去下载媒体资源
        int result = downloadAdsAndGenLocalAdListToSqlite(ads,size);


        //根据result的返回情况通知qt进程---进程之间的通讯


        //4 释放new出来相关广告的资源
         for (int i = 0; i < size; i++)
        {
            Ad *ad =  ads[i];
            printf("adid=%d\n",ad->id);
            for (int i = 0; i < 3; i++)
            {
                AdResource *ar = ad->resources[i];
                if (ar!=NULL)
                {
                    g_print("url=%s\n",ar->path);
                    free(ar);
                }
            }
            free(ad);
        }

        //5 如果有新的广播，通知QT进程重新加载播放列表
        if (result==1)
        {
           printf("发通知给QT进程加载本地播放列表！\n");
        }else{
           printf("没有新的广告！\n");
        }



    }
    



}

/**
 * 返回值 int 如果是 1 就代表 需要通知at进程重新加载播放列表，此时有广告更新情况
 * 
 *
 */

int downloadAdsAndGenLocalAdListToSqlite(Ad *ads[],int size){
    //决定是否要通知qt进程重新加载数据标识
    int result=0;
    //1.循环ads数据
    for (int i = 0; i <size; i++)
    {
        //1.根据ad的id去数据库查询数据
        Ad *ad= ads[i];
        //取出id 
        int adId =  ad->id;
        Ad  *adInDb= getAd(adId);
        //2.根据数据有没有左判断分流
        if (adInDb==NULL)//当前的数据没有存储到本地的数据
        {
            result=1;//qt重新要加载数据
            //先把ad保存到数据库
            saveAd(ad);
            //处理需要保存的资源数据            
            for (int j = 0; j < 3; j++)
            {
                AdResource *ar = ad->resources[j];
                if (ar!=NULL)
                {
                    //把媒体资源下载到本地，并且把  AdResource  的path替换为本地存储的路径
                    //http://47.109.65.208/images/video/44.mp4
                    char* resPath = getResPath(ar); ///home/heron/ronghua-ads/media/1_44.mp4
                    if(!g_file_test(resPath,G_FILE_TEST_EXISTS)){
                       //创建文件
                        GFile  *file = g_file_new_for_path(resPath);
                        g_print("%s\n",resPath);
                        // // 使用GFile对象创建文件，如果文件已存在则不进行任何操作
                        if (!g_file_create(file, 0, NULL,NULL))
                        {
                            g_print("create file error!\n");
                        }         
                    }   
                    //下载文件到本地
                    downloadRes(ar->path,resPath);
                    //把原来的网络地址替换为本地地址
                    ar->path=resPath;
                    //保存数据到数据库    
                    saveAr(ar);
                }                

            }
            
        }else{//数据库有数据
            //1.更新本地的ad 防止有时间的变化
            updateAd(ad);
            //处理广告的资源
            for (int j = 0; j < 3; j++)
            {
                AdResource *ar= ad->resources[j];
                //获取加密的串
                char *signOnLine= ar->sign;
                char *resPath= getResPath(ar);
                //获取当前资源对应的文件进行加密以后 标识
                /*
                    找到当前的文件的 AdResource  path里面存储的就是本地文件的路径  再使用md5进行加密
                */
                //char *localSign= md5(resPath);
                char *localSign="jfjjfjfjj";

                if(!g_str_equal(signOnLine,localSign)){
                 
                    //下载文件
                    downloadRes(ar->path,resPath);
                    //把原来的网络地址替换为本地地址
                    ar->path=resPath;
                    //保存数据到数据库    
                    updateAr(ar);
                    result=1;
                }else{
                    //数据不需要更新
                    printf("数据无需更新");
                }

            }
            
        }//数据库有数据结束
            
    }
    

    return result;

}


